home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / COMAL / T-COMAL Today / (k)ta.d64 / musicroutine.src < prev    next >
Text File  |  2007-02-28  |  8KB  |  286 lines

  1. ;********************************
  2. ;*                              *
  3. ;*   INTERRUPT DRIVEN           *
  4. ;*                              *
  5. ;*   SOUND INTERPRETER          *
  6. ;*                              *
  7. ;********************************
  8. ;
  9. ;--------------------------------
  10. ;USES 2 ZERO PAGE LOCATIONS
  11. ;PUT ADDRESS OF DATA IN LO/HI
  12. ;FASHION AT THIS ADDRESS
  13. ;
  14. SOUND    = $F9    ;THESE ARE RS232
  15. ;                 ;POINTERS AND
  16. ;                 ;SHOULDN'T
  17. ;                 ;INTERFERE WITH
  18. ;                 ;COMAL.
  19. ;
  20. ;--------------------------------
  21. ;
  22. IRQVC    = $10E5
  23. VOLUME   = $D418
  24. SID      = $D400
  25.         *= $CDC0     ;ROUTINE USES
  26.                      ;RS232 BUFFER
  27.                      ;AND SPRITE
  28.                      ;NUMBER 55
  29. ;
  30. BEGIN   LDA   #00
  31.         STA   STACKP
  32. INIT    SEI           ;SET UP TO PLAY MUSIC AT EVERY INTERRUPT
  33.         LDA   #$FF    ;SET TIMER
  34.         STA   TIMER
  35.         LDA   IRQVC   ;EVERY 1/60
  36.         STA   IRQSV   ;GOTO LABEL
  37.         LDA   IRQVC+1 ;RUN.
  38.         STA   IRQSV+1
  39.         LDA   #<RUN
  40.         STA   IRQVC
  41.         LDA   #>RUN
  42.         STA   IRQVC+1
  43.         CLI
  44.         LDA   #15
  45.         STA   VOLUME
  46.         RTS
  47. ;
  48. ENDSNG  SEI            ;STOP PLAYING MUSIC - WITHDRAW SEQUENCE
  49.         LDA   IRQSV
  50.         STA   IRQVC
  51.         LDA   IRQSV+1
  52.         STA   IRQVC+1
  53.         CLI
  54.         LDA   #0
  55.         STA   VOLUME
  56.         RTS
  57. ;
  58. ;
  59. RUN     STA   ASAVE   ;SAVE REG'S
  60.         STY   YSAVE
  61.         STX   XSAVE
  62.         LDY   #$00    ;LOAD Y INDEX WITH ZERO OFFSET
  63.         CLD
  64.         INC   TIMER      ;INCREMENT TIMER
  65.         LDA   (SOUND),Y
  66.         CMP   TIMER      ;COMPARE WITH NEXT PLAYING TIME
  67.         BEQ   ISTIM
  68.         JMP   JMPIRQ     ;NOT TIME TO CHANGE ANYTHING
  69. ;
  70. ISTIM   JSR   INCSND     ;IT'S TIME SO GO TO NEXT INSTRUCTION
  71. PLYNOT  LDA   (SOUND),Y  ;GET NEXT BYTE
  72.         BMI   SPCMD      ;IF BIT #7 IS ON THEN IT IS A COMMAND BYTE
  73.         JSR   INCSND     ;ELSE IT IS A REGISTER NUMBER SO POINT TO NEXT
  74. TRNREG  TAX
  75.         LDA   (SOUND),Y  ;LOAD BYTE TO GO TO SID CHIP
  76.         STA   SID,X      ;STORE BYTE IN SID CHIP
  77.         STA   SIDREG,X   ;AND IN MEMORY COPY (FOR READING PURPOSES)
  78.         JSR   INCSND     ;POINT TO NEXT BYTE
  79.         JMP   PLYNOT     ;JUMP BACK FOR NEXT COMMAND
  80. SPCMD   JSR   INCSND ;THIS IS A COMMAND SO POINT TO NEXT BYTE
  81.         CMP   #$F0
  82.         BEQ   NTV1ON ;PLAY NOTE ON VOICE ONE
  83.         CMP   #$F1   ;VOICE 2
  84.         BEQ   NTV2ON
  85.         CMP   #$F2   ;VOICE 3
  86.         BEQ   NTV3ON
  87.         CMP   #$F3   ;TURN VOICE 1 OFF (FINISHED ATTACK/DECAY/SUSTAIN)
  88.         BEQ   NTV1OF
  89.         CMP   #$F4   ;VOICE 2
  90.         BEQ   NTV2OF
  91.         CMP   #$F5   ;VOICE 3
  92.         BEQ   NTV3OF
  93.         JMP   NXTCMD ;NEXT CMD
  94. ;
  95. NTV1ON  JSR   DEFNOT ;DEFINE NOTE
  96.         LDX   #$00    ;FOR V1
  97.         JMP   STRNOT ;STORE SAME
  98. NTV2ON  JSR   DEFNOT
  99.         LDX   #$07    ;FOR V2
  100.         JMP   STRNOT
  101. NTV3ON  JSR   DEFNOT
  102.         LDX   #$0E    ;FOR V3
  103.         JMP   STRNOT
  104. ;
  105. NTV1OF  LDX   #$04    ;VOICE 1 OFF
  106.         BNE   NOTOFF
  107. NTV2OF  LDX   #$0B    ;VOICE 2 OFF
  108.         BNE   NOTOFF
  109. NTV3OF  LDX   #$12    ;V3 OFF
  110. NOTOFF  LDA   SIDREG,X  ;LOAD MEMORY COPY
  111.         AND   #$FE      ;TURN OFF GATE
  112.         STA   SIDREG,X  ;STORE IN MEMORY COPY
  113.         STA   SID,X     ;AND SID CHIP
  114.         JMP   PLYNOT    ;JUMP BACK FOR MORE
  115. ;
  116. DEFNOT  LDA   (SOUND),Y ;LOAD NOTE
  117.         JSR   INCSND
  118.         PHA             ;SAVE NOTE
  119.         AND   #$0F      ;MASK FOR NOTE ONLY (BLOCK OUT OCTAVE)
  120.         ASL   A         ;MULTIPLY BY 2 TO PICK UP FREQ IN TABLE (2 BYTES)
  121.         TAX
  122.         LDA   NOTE,X    ;PICK UP LOW PART OF FREQ
  123.         STA   ACCUML
  124.         INX
  125.         LDA   NOTE,X    ;PICK UP HI PART OF FREQ
  126.         STA   ACCUMH
  127.         PLA             ;PULL BACK NOTE
  128.         AND   #$70      ;MASK FOR OCTAVE (0-7) IN UPPER FOUR BITS
  129.         LDX   #$04
  130. MKOCTV  LSR   A         ;MOVE TO LOWER FOUR BITS
  131.         DEX
  132.         BNE   MKOCTV
  133.         EOR   #$07      ;FLIP TO FIGURE NUMBER OF TIMES TO SHIFT FREQ
  134.         TAX
  135.         INX             ;LEAVE IN-MAKES NEXT LOOP EASIER
  136. SFTFEQ  DEX             ;DIVIDE FREQ OF NOTE IN HALF FOR EVERY OCTAVE
  137.         BEQ   FNSHFQ    ;UNDER 7
  138.         LSR   ACCUMH
  139.         ROR   ACCUML
  140.         CLC
  141.         BCC   SFTFEQ
  142. FNSHFQ  RTS             ;PROPER FREQ IS READY - SO RETURN
  143. ;
  144. STRNOT  LDA   ACCUML    ;PUT FREQ
  145.         STA   SID,X     ;IN SID
  146.         STA   SIDREG,X  ;AND IN
  147.         INX             ;MEMORY
  148.         LDA   ACCUMH    ;REG'S.
  149.         STA   SID,X
  150.         STA   SIDREG,X
  151.         INX
  152.         INX
  153.         INX
  154.         LDA   SIDREG,X  ;SWITCH ON
  155.         ORA   #$01      ;GATE -
  156.         STA   SID,X     ;START NOTE
  157.         STA   SIDREG,X
  158.         JMP   PLYNOT    ;BACK FOR MORE
  159. ;
  160. NXTCMD  CMP   #$F7    ;IN-LINE MACHINE CODE ROUTINE
  161.         BNE   NOTASM
  162.         JMP   (SOUND)
  163. NOTASM  CMP   #$FB    ;ABSOLUTE JUMP
  164.         BEQ   JMPDAT
  165.         CMP   #$FC    ;RETURN FROM SUBROUTINE
  166.         BEQ   RTSMSR
  167.         CMP   #$FD    ;ABSOLUTE JSR
  168.         BEQ   JSRMSR
  169.         CMP   #$FE    ;END OF CHANGES - NEXT BYTE IS TIMER BYTE
  170.         BEQ   LSTCNG
  171.         CMP   #$FF    ;END SONG
  172.         BEQ   FINISH
  173.         CMP   #$FA    ;ZERO SID
  174.         BEQ   TRNOFF
  175.         CMP   #$F9    ;RELATIVE JSR
  176.         BEQ   BSRMSR
  177.         CMP   #$F8    ;RELATIVE JUMP
  178.         BEQ   BRAMSR
  179.         JMP   FINISH  ;NOT A KNOW COMMAND SO END SONG
  180. ;
  181. JSRMSR  JSR   STKPOS    ;SAVE RETURN ADDRESS
  182. JMPDAT  LDA   (SOUND),Y ;JUMP TO NEXT INSTRUCTION
  183.         TAX
  184.         INY
  185.         LDA   (SOUND),Y
  186.         STA   SOUND
  187.         STX   SOUND+1
  188.         JMP   PLYNOT    ;NEXT COMMAND
  189. ;
  190. RTSMSR  DEC   STACKP    ;PULL DOWN STACK POINTER
  191.         DEC   STACKP
  192.         LDX   STACKP
  193.         LDA   STACK,X   ;PUT STACK CONTENTS IN SOUND POINTER
  194.         STA   SOUND
  195.         INX
  196.         LDA   STACK,X
  197.         STA   SOUND+1
  198.         JMP   PLYNOT
  199. ;
  200. LSTCNG  LDA   #$00    ;ZERO TIMER
  201.         STA   TIMER
  202.         JMP   JMPIRQ
  203. ;
  204. FINISH  LDA   IRQSV   ;WITHDRAW FROM INTERRUPT STRUCTURE
  205.         STA   IRQVC
  206.         LDA   IRQSV+1
  207.         STA   IRQVC+1
  208.         JMP   JMPIRQ
  209. ;
  210. TRNOFF  LDX   #$18    ;ZERO SID CHIP
  211.         LDA   #$00
  212. LPOFF   STA   SID,X
  213.         STA   SIDREG,X
  214.         DEX
  215.         BPL   LPOFF
  216.         JMP   PLYNOT
  217. ;
  218. BSRMSR  JSR   STKPOS    ;RELATIVE
  219. BRAMSR  LDY   #$01      ;BRANCHING
  220.         LDA   (SOUND),Y ;JUST LIKE
  221.         CLC             ;6502
  222.         ADC   SOUND     ;(SAME
  223.         DEY             ; FORMAT)
  224.         TAX
  225.         LDA   (SOUND),Y
  226.         ADC   SOUND+1
  227.         STA   SOUND+1
  228.         STX   SOUND
  229.         JMP   PLYNOT
  230. ;
  231. MUSIC   PLA           ;JSR HERE
  232.         STA   SOUND   ;AFTER MACHINE LANGUAGE ROUTINE
  233.         PLA
  234.         STA   SOUND+1
  235.         JMP   PLYNOT
  236. ;
  237. JMPIRQ  LDA   ASAVE   ;RESTORE
  238.         LDX   XSAVE   ;REG'S AND
  239.         LDY   YSAVE   ;CONTINUE
  240.         JMP   (IRQSV) ;REGULAR IRQ
  241. ;
  242. INCSND  INC   SOUND   ;INCREMENT
  243.         BNE   RTN     ;POINTER
  244.         INC   SOUND+1
  245. RTN     RTS
  246. ;
  247. STKPOS  LDX   STACKP  ;STACK RETURN ADDRESS OF NEXT COMMAND
  248.         LDA   SOUND
  249.         CLC
  250.         ADC   #$02
  251.         STA   STACK,X
  252.         INX
  253.         LDA   SOUND+1
  254.         ADC   #$00
  255.         STA   STACK,X
  256.         INC   STACKP
  257.         INC   STACKP
  258.         RTS
  259. ;
  260. XSAVE   .BYTE 0
  261. YSAVE   .BYTE 0
  262. ASAVE   .BYTE 0
  263. IRQSV   .BYTE 0,0
  264. TIMER   .BYTE 0
  265. ACCUML  .BYTE 0
  266. ACCUMH  .BYTE 0
  267. NOTE    .WORD 34334 ;FREQUENCY
  268.         .WORD 36376 ;TABLE TAKEN
  269.         .WORD 38539 ;FROM THE
  270.         .WORD 40830 ;COMMODORE 64
  271.         .WORD 43258 ;PROGRAMERS
  272.         .WORD 45830 ;REFERENCE
  273.         .WORD 48556 ;GUIDE.
  274.         .WORD 51443
  275.         .WORD 54502
  276.         .WORD 57743
  277.         .WORD 61176
  278.         .WORD 64814
  279. STACKP  .BYTE 0
  280. SIDREG  .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  281. ;
  282. STACK   .BYTE 0,0,0,0,0,0,0,0,0,0
  283.         .BYTE 0,0,0,0,0,0,0,0,0,0
  284. ;SPACE FOR 10 NESTED SUBROUTINE CALLS
  285. .END
  286.